package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.DocenciaDAOLocal;
import pe.gob.osce.sirenas.dao.convert.DocenciaConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.DocenciaDTO;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.Docencia;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialCapacitacion;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialDocencia;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class DocenciaDAOImpl implements DocenciaDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	@Override
	public Docencia insert(Docencia  docencia ) throws Exception {
		try{
			em.merge(docencia);
			em.flush();
			return docencia;
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
	}

	@Override
	public List<DocenciaDTO> obtenerDocencia(Long idFicha) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Docencia> insertList(List<Docencia> docencia) throws Exception {
		List<Docencia> listDocenciaJPA;	
		try{
			listDocenciaJPA=new ArrayList<Docencia>();
				for (Docencia obj: docencia) {
					obj=em.merge(obj);
					em.flush();
					listDocenciaJPA.add(obj);		
				}		
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
	
		return listDocenciaJPA;
	}

	@Override 
	public List<DocenciaDTO>  obtenerListaDocencia(Long idFicha)
			throws Exception {

		List<DocenciaDTO> listDocenciaDTO=null;		
		List<Docencia> listaDocenciaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append("SELECT doc FROM Docencia doc WHERE  doc.idFicha = :idFicha AND doc.estado=1  ORDER BY doc.indEspecialidad, doc.auditoria.fechaRegistro DESC ");
						
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			List<Docencia>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaDocenciaJPA=new ArrayList<Docencia>();
				for (Docencia obj: listaObjeto) {					
					listaDocenciaJPA.add(obj);
				}
				listDocenciaDTO=DocenciaConvert.createListDTO(listaDocenciaJPA);
			}

		} catch (NoResultException nre) {
			listDocenciaDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listDocenciaDTO;
	}
	
	@Override 
	public Docencia consultaDocencia(Long idDocencia)
			throws Exception {
		Docencia		DocenciaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT doc FROM Docencia doc WHERE doc.idDocencia = :idDocencia");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idDocencia", idDocencia);
			
			List<Docencia> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				
				for (Docencia obj: listaObjeto) {					
					DocenciaJPA=(obj);
				}				
			}
		} catch (NoResultException nre) {
			DocenciaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return DocenciaJPA;
	}	
	
	
	@Override
	public Boolean insertHistorialDocencia(HistorialDocencia historialDocencia ) throws Exception {
		boolean confirmacion= false;
		try {
			em.merge(historialDocencia);
			em.flush();
			confirmacion= true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		
		return confirmacion;
	}

	@Override 
	public List<HistorialDocencia> consultarHistorialDocencia(Long idDocencia)
			throws Exception {
		Docencia		docenciaJPA=null;
		List<HistorialDocencia>		listHistorialDocenciaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT doc FROM HistorialDocencia doc WHERE doc.idDocencia = :idDocencia");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idDocencia", idDocencia);
			
			List<HistorialDocencia> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listHistorialDocenciaJPA=new ArrayList<HistorialDocencia>();
				for (HistorialDocencia obj: listaObjeto) {					
					listHistorialDocenciaJPA.add(obj);
				}				
			}

		} catch (NoResultException nre) {
			listHistorialDocenciaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listHistorialDocenciaJPA;
	}	
	
	
	
}
